package cn.iocoder.boot.springai001.service;

import io.modelcontextprotocol.client.McpSyncClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * MCP 服务器管理器（高级功能 - 可选）
 * <p>
 * 提供运行时动态添加/删除 MCP 服务器的能力
 * <p>
 * ⚠️ 注意：
 * 1. 标准的 Spring AI 不支持动态添加服务器
 * 2. 这是自定义实现，需要手动管理客户端生命周期
 * 3. 生产环境建议重启应用而不是动态添加
 */
@Slf4j
@Service
public class McpServerManager {

    // 使用线程安全的列表
    private final CopyOnWriteArrayList<McpSyncClient> runtimeClients = new CopyOnWriteArrayList<>();

    /**
     * 动态添加 MCP 客户端
     * <p>
     * ⚠️ 这需要手动创建和配置客户端，比较复杂
     * 
     * @param client 已创建并配置好的 MCP 客户端
     */
    public void addClient(McpSyncClient client) {
        log.info("动态添加 MCP 客户端: {}", client.getServerInfo().name());
        runtimeClients.add(client);
    }

    /**
     * 动态移除 MCP 客户端
     */
    public void removeClient(String serverName) {
        runtimeClients.removeIf(client -> {
            boolean match = client.getServerInfo().name().equals(serverName);
            if (match) {
                log.info("动态移除 MCP 客户端: {}", serverName);
                try {
                    client.close(); // 关闭客户端连接
                } catch (Exception e) {
                    log.error("关闭客户端失败: {}", e.getMessage());
                }
            }
            return match;
        });
    }

    /**
     * 获取所有运行时客户端
     */
    public List<McpSyncClient> getRuntimeClients() {
        return List.copyOf(runtimeClients);
    }

    /**
     * 重新加载配置（模拟）
     * <p>
     * ⚠️ 真实实现需要：
     * 1. 重新解析 mcp-servers.json
     * 2. 对比新旧配置
     * 3. 添加新服务器
     * 4. 移除不存在的服务器
     * 5. 手动创建和配置客户端
     */
    public void reloadConfiguration() {
        log.warn("配置热重载需要自定义实现，建议重启应用");
        log.info("当前做法：修改 mcp-servers.json 后重启应用");
    }
}

